package com.wonders.frame.chron.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

/**
 * 访问FreeMarker的工具类
 * 
 * @author xiangyang.li
 *
 */
public class FreeMarkerUtils {

	public static final Logger LOG = Logger.getLogger(FreeMarkerUtils.class);

	/** 是否已初始化 */
	public static boolean isInit = false;

	/** 应用所在路径 */
	public static String appPath = null;

	/** 编码格式 UTF-8 */
	public static final String ENCODING = "UTF-8";

	/** FreeMarker配置 */
	public static Configuration config = new Configuration();

	/**
	 * /**
     * 初始化FreeMarker配置
     * @param applicationPath 应用所在路径
	 * @param response   设置响应方式
	 */
	public static void initFreeMarker(String applicationPath,
			HttpServletResponse response,String fileName) {
		
		System.out.println(fileName);
		
		try {
			response.setContentType("application/octet-stream; charset="+ENCODING);
			
			response.setHeader(
					"content-disposition",
					"attachment;filename="+  java.net.URLEncoder.encode(fileName, "UTF-8")+ ".doc");
			System.out.println(applicationPath);
			appPath = applicationPath;
			// 加载模版
			File file = new File(new StringBuffer(appPath).append(
					File.separator).toString());
			// 设置要解析的模板所在的目录，并加载模板文件
			config.setDirectoryForTemplateLoading(file);
			// 设置文件编码为UTF-8
			config.setEncoding(Locale.getDefault(), ENCODING);
			isInit = true;
		} catch (IOException e) {
			LOG.error("初始化FreeMarker配置出错", e);
		}
	}

	/**
	 * 以下载的方式生成word，自定义路径
	 * @param dataMap  一个Map的数据结果集
	 * @param out
	 * @param templateFileName ftl模版路径(已默认为WEB-INF/templates,文件名相对此路径) 
	 * @throws IOException
	 */
	public static void createDoc(Map<String, Object> dataMap, Writer out,
			String templateFileName){

		// 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet，classpath，数据库装载，
		// ftl文件存放路径

		Template template = null;
		try {
			// test.ftl为要装载的模板
			template = config.getTemplate(templateFileName);
			// 处理模版
			template.process(dataMap, out);
			out.flush();
			System.out.println("生成成功............");
			LOG.info("由模板文件" + templateFileName + "生成成功.");
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("生成失败............");
			LOG.error("由模板文件" + templateFileName + "生成出错.", e);
		} finally {
			try {
				if (out != null) {
					out.close();
				}
			} catch (IOException e) {
				LOG.error("关闭Write对象出错", e);
			}
		}
	}
}
